package com.zhike.service.im.client.event;

import java.util.Observer;

import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;
import com.zhike.mobileimsdk.server.protocal.s.PKickoutInfo;

/**
 * 与IM服务器的连接事件在此ChatBaseEvent子类中实现即可。
 * 
 * @author Jack Jiang
 * @version.1.1
 */
@Slf4j
@Component
public class ChatBaseEventImpl implements ChatBaseEvent {
	private final static String TAG = ChatBaseEventImpl.class.getSimpleName();

	// 本Observer目前仅用于登陆时（因为登陆与收到服务端的登陆验证结果
	// 是异步的，所以有此观察者来完成收到验证后的处理）
	private Observer loginOkForLaunchObserver = null;

	/**
	 * 本地用户的登陆结果回调事件通知。
	 * 
	 * @param errorCode 服务端反馈的登录结果：0 表示登陆成功，否则为服务端自定义的出错代码（按照约定通常为>=1025的数）
	 */
	@Override
	public void onLoginResponse(int errorCode) {
		if (errorCode == 0) {
			log.info("{}", "【DEBUG_UI】IM服务器登录/重连成功！");
		} else {
			log.error("{}", "【DEBUG_UI】IM服务器登录/连接失败，错误代码：" + errorCode);
		}

		// 此观察者只有开启程序首次使用登陆界面时有用
		if (loginOkForLaunchObserver != null) {
			loginOkForLaunchObserver.update(null, errorCode);
			loginOkForLaunchObserver = null;
		}
	}

	/**
	 * 与服务端的通信断开的回调事件通知。
	 * <br>
	 * 该消息只有在客户端连接服务器成功之后网络异常中断之时触发。<br>
	 * 导致与与服务端的通信断开的原因有（但不限于）：无线网络信号不稳定、网络切换等。
	 * 
	 * @param errorCode 本回调参数表示表示连接断开的原因，目前错误码没有太多意义，仅作保留字段，目前通常为-1
	 */
	@Override
	public void onLinkClose(int errorCode) {
		log.error("{}", "【DEBUG_UI】与IM服务器的网络连接出错关闭了，error：" + errorCode);
	}

	/**
	 * 本的用户被服务端踢出的回调事件通知。
	 *
	 * @param kickoutInfo 被踢信息对象，{@link PKickoutInfo} 对象中的 code字段定义了被踢原因代码
	 */
	@Override
	public void onKickout(PKickoutInfo kickoutInfo) {
		log.error("{}", "【DEBUG_UI】已收到服务端的\"被踢\"指令，kickoutInfo.code：" + kickoutInfo.getCode());

		String alertContent = "";
		if (kickoutInfo.getCode() == PKickoutInfo.KICKOUT_FOR_DUPLICATE_LOGIN) {
			alertContent = "账号已在其它地方登陆，当前会话已断开，请退出后重新登陆！";
		} else if (kickoutInfo.getCode() == PKickoutInfo.KICKOUT_FOR_ADMIN) {
			alertContent = "已被管理员强行踢出聊天，当前会话已断开！";
		} else {
			alertContent = "你已被踢出聊天，当前会话已断开（kickoutReason=" + kickoutInfo.getReason() + "）！";
		}
	}

	public void setLoginOkForLaunchObserver(Observer loginOkForLaunchObserver) {
		this.loginOkForLaunchObserver = loginOkForLaunchObserver;
	}

}
